/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.common;

import vip.dexian.common.utils.SpringUtils;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import vip.dexian.common.utils.SpringUtils;

/**
 * 消息类
 *
 * @author 挺好的 2023年05月30日 8:00
 */
@Data
@EqualsAndHashCode (callSuper = false)
public class Message {

    /**
     * 成功消息错误码key
     */
    private static final String SUCCESS_CODE_NAME = "00000";

    /**
     * 警告消息错误码key
     */
    private static final String WARN_CODE_NAME = "00001";

    /**
     * 成功消息
     */
    private static final Message SUCCESS = new Message(Type.SUCCESS, SUCCESS_CODE_NAME, null, null);

    /**
     * 消息类型
     */
    public enum Type {
        /**
         * 成功消息
         */
        SUCCESS,

        /**
         * 警告消息
         */
        WARN,

        /**
         * 错误消息
         */
        ERROR
    }

    /**
     * 类型
     */
    private Type type;

    /**
     * 内容
     */
    private String message;

    /**
     * 错误码
     */
    private String code;

    /**
     * 包含的结果
     */
    private Object result;

    /**
     * 构造消息
     *
     * @param type
     *         类型
     * @param code
     *         错误码
     * @param result
     *         结果
     * @param args
     *         国际化占位消息
     */
    private Message (Type type, String code, String message, Object result, Object... args) {
        Assert.hasText(code, "错误码不能为空");

        this.type   = type;
        this.code   = code;
        this.result = result;

        if (StringUtils.isEmpty(message)) {
            this.message = SpringUtils.getMessage(code, args);
        } else {
            this.message = message;
        }
    }

    /**
     * 成功消息
     *
     * @return 消息对象
     */
    public static Message success () {
        return SUCCESS;
    }

    /**
     * 成功消息
     *
     * @param result
     *         结果
     * @param args
     *         国际化占位消息
     *
     * @return 消息对象
     */
    public static Message success (Object result, Object... args) {
        return new Message(Type.SUCCESS, SUCCESS_CODE_NAME, null, result, args);
    }

    /**
     * 警告消息，主要用于表单校验或者业务逻辑校验
     *
     * @param message
     *         错误消息（不是错误码）
     *
     * @return 消息对象
     */
    public static Message warn (String message) {
        return new Message(Type.WARN, WARN_CODE_NAME, message, null);
    }

    /**
     * 警告消息，主要用于表单校验或者业务逻辑校验
     *
     * @param code
     *         错误消息（不是错误码）
     *
     * @return 消息对象
     */
    public static Message warn (String code, Object... args) {
        return new Message(Type.WARN, code, null, null, args);
    }


    /**
     * 警告消息，主要用于表单校验或者业务逻辑校验
     *
     * @param code
     *         错误消息（不是错误码）
     *
     * @return 消息对象
     */
    public static Message warn (String code, Object result, Object... args) {
        return new Message(Type.WARN, code, null, result, args);
    }

    /**
     * 错误消息。主要用于表单校验或者业务逻辑校验
     *
     * @param code
     *         错误码
     *
     * @return 消息对象
     */
    public static Message error (String code) {
        return new Message(Type.ERROR, code, null, null);
    }

    /**
     * 错误消息。主要用于表单校验或者业务逻辑校验
     *
     * @param code
     *         错误码
     *
     * @return 消息对象
     */
    public static Message error (Integer code) {
        return new Message(Type.ERROR, code.toString(), null, null);
    }

    /**
     * 错误消息。主要用于表单校验或者业务逻辑校验
     *
     * @param code
     *         错误码
     * @param result
     *         结果
     * @param args
     *         国际化占位消息
     *
     * @return 消息对象
     */
    public static Message error (String code, Object result, Object... args) {
        return new Message(Type.ERROR, code, null, result, args);
    }
}
